home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / share / pyshared / PIL / Image.py < prev    next >
Text File  |  2008-06-23  |  67KB  |  2,122 lines

  1. #
  2. # The Python Imaging Library.
  3. # $Id: Image.py 2933 2006-12-03 12:08:22Z fredrik $
  4. #
  5. # the Image class wrapper
  6. #
  7. # partial release history:
  8. # 1995-09-09 fl   Created
  9. # 1996-03-11 fl   PIL release 0.0 (proof of concept)
  10. # 1996-04-30 fl   PIL release 0.1b1
  11. # 1999-07-28 fl   PIL release 1.0 final
  12. # 2000-06-07 fl   PIL release 1.1
  13. # 2000-10-20 fl   PIL release 1.1.1
  14. # 2001-05-07 fl   PIL release 1.1.2
  15. # 2002-03-15 fl   PIL release 1.1.3
  16. # 2003-05-10 fl   PIL release 1.1.4
  17. # 2005-03-28 fl   PIL release 1.1.5
  18. # 2006-12-02 fl   PIL release 1.1.6
  19. #
  20. # Copyright (c) 1997-2006 by Secret Labs AB.  All rights reserved.
  21. # Copyright (c) 1995-2006 by Fredrik Lundh.
  22. #
  23. # See the README file for information on usage and redistribution.
  24. #
  25.  
  26. VERSION = "1.1.6"
  27.  
  28. try:
  29.     import warnings
  30. except ImportError:
  31.     warnings = None
  32.  
  33. class _imaging_not_installed:
  34.     # module placeholder
  35.     def __getattr__(self, id):
  36.         raise ImportError("The _imaging C module is not installed")
  37.  
  38. try:
  39.     # give Tk a chance to set up the environment, in case we're
  40.     # using an _imaging module linked against libtcl/libtk (use
  41.     # __import__ to hide this from naive packagers; we don't really
  42.     # depend on Tk unless ImageTk is used, and that module already
  43.     # imports Tkinter)
  44.     __import__("FixTk")
  45. except ImportError:
  46.     pass
  47.  
  48. try:
  49.     # If the _imaging C module is not present, you can still use
  50.     # the "open" function to identify files, but you cannot load
  51.     # them.  Note that other modules should not refer to _imaging
  52.     # directly; import Image and use the Image.core variable instead.
  53.     import _imaging
  54.     core = _imaging
  55.     del _imaging
  56. except ImportError, v:
  57.     core = _imaging_not_installed()
  58.     if str(v)[:20] == "Module use of python" and warnings:
  59.         # The _imaging C module is present, but not compiled for
  60.         # the right version (windows only).  Print a warning, if
  61.         # possible.
  62.         warnings.warn(
  63.             "The _imaging extension was built for another version "
  64.             "of Python; most PIL functions will be disabled",
  65.             RuntimeWarning
  66.             )
  67.  
  68. import ImageMode
  69. import ImagePalette
  70.  
  71. import os, stat, string, sys
  72.  
  73. # type stuff
  74. from types import IntType, StringType, TupleType
  75.  
  76. try:
  77.     UnicodeStringType = type(unicode(""))
  78.     ##
  79.     # (Internal) Checks if an object is a string.  If the current
  80.     # Python version supports Unicode, this checks for both 8-bit
  81.     # and Unicode strings.
  82.     def isStringType(t):
  83.         return isinstance(t, StringType) or isinstance(t, UnicodeStringType)
  84. except NameError:
  85.     def isStringType(t):
  86.         return isinstance(t, StringType)
  87.  
  88. ##
  89. # (Internal) Checks if an object is a tuple.
  90.  
  91. def isTupleType(t):
  92.     return isinstance(t, TupleType)
  93.  
  94. ##
  95. # (Internal) Checks if an object is an image object.
  96.  
  97. def isImageType(t):
  98.     return hasattr(t, "im")
  99.  
  100. ##
  101. # (Internal) Checks if an object is a string, and that it points to a
  102. # directory.
  103.  
  104. def isDirectory(f):
  105.     return isStringType(f) and os.path.isdir(f)
  106.  
  107. from operator import isNumberType, isSequenceType
  108.  
  109. #
  110. # Debug level
  111.  
  112. DEBUG = 0
  113.  
  114. #
  115. # Constants (also defined in _imagingmodule.c!)
  116.  
  117. NONE = 0
  118.  
  119. # transpose
  120. FLIP_LEFT_RIGHT = 0
  121. FLIP_TOP_BOTTOM = 1
  122. ROTATE_90 = 2
  123. ROTATE_180 = 3
  124. ROTATE_270 = 4
  125.  
  126. # transforms
  127. AFFINE = 0
  128. EXTENT = 1
  129. PERSPECTIVE = 2
  130. QUAD = 3
  131. MESH = 4
  132.  
  133. # resampling filters
  134. NONE = 0
  135. NEAREST = 0
  136. ANTIALIAS = 1 # 3-lobed lanczos
  137. LINEAR = BILINEAR = 2
  138. CUBIC = BICUBIC = 3
  139.  
  140. # dithers
  141. NONE = 0
  142. NEAREST = 0
  143. ORDERED = 1 # Not yet implemented
  144. RASTERIZE = 2 # Not yet implemented
  145. FLOYDSTEINBERG = 3 # default
  146.  
  147. # palettes/quantizers
  148. WEB = 0
  149. ADAPTIVE = 1
  150.  
  151. # categories
  152. NORMAL = 0
  153. SEQUENCE = 1
  154. CONTAINER = 2
  155.  
  156. # --------------------------------------------------------------------
  157. # Registries
  158.  
  159. ID = []
  160. OPEN = {}
  161. MIME = {}
  162. SAVE = {}
  163. EXTENSION = {}
  164.  
  165. # --------------------------------------------------------------------
  166. # Modes supported by this version
  167.  
  168. _MODEINFO = {
  169.     # NOTE: this table will be removed in future versions.  use
  170.     # getmode* functions or ImageMode descriptors instead.
  171.  
  172.     # official modes
  173.     "1": ("L", "L", ("1",)),
  174.     "L": ("L", "L", ("L",)),
  175.     "I": ("L", "I", ("I",)),
  176.     "F": ("L", "F", ("F",)),
  177.     "P": ("RGB", "L", ("P",)),
  178.     "RGB": ("RGB", "L", ("R", "G", "B")),
  179.     "RGBX": ("RGB", "L", ("R", "G", "B", "X")),
  180.     "RGBA": ("RGB", "L", ("R", "G", "B", "A")),
  181.     "CMYK": ("RGB", "L", ("C", "M", "Y", "K")),
  182.     "YCbCr": ("RGB", "L", ("Y", "Cb", "Cr")),
  183.  
  184.     # Experimental modes include I;16, I;16B, RGBa, BGR;15,
  185.     # and BGR;24.  Use these modes only if you know exactly
  186.     # what you're doing...
  187.  
  188. }
  189.  
  190. if sys.byteorder == 'little':
  191.     _ENDIAN = '<'
  192. else:
  193.     _ENDIAN = '>'
  194.  
  195. _MODE_CONV = {
  196.     # official modes
  197.     "1": ('|b1', None),
  198.     "L": ('|u1', None),
  199.     "I": ('%si4' % _ENDIAN, None), # FIXME: is this correct?
  200.     "I;16": ('%si2' % _ENDIAN, None),
  201.     "F": ('%sf4' % _ENDIAN, None), # FIXME: is this correct?
  202.     "P": ('|u1', None),
  203.     "RGB": ('|u1', 3),
  204.     "RGBX": ('|u1', 4),
  205.     "RGBA": ('|u1', 4),
  206.     "CMYK": ('|u1', 4),
  207.     "YCbCr": ('|u1', 4),
  208. }
  209.  
  210. def _conv_type_shape(im):
  211.     shape = im.size[::-1]
  212.     typ, extra = _MODE_CONV[im.mode]
  213.     if extra is None:
  214.         return shape, typ
  215.     else:
  216.         return shape+(extra,), typ
  217.  
  218.  
  219. MODES = _MODEINFO.keys()
  220. MODES.sort()
  221.  
  222. # raw modes that may be memory mapped.  NOTE: if you change this, you
  223. # may have to modify the stride calculation in map.c too!
  224. _MAPMODES = ("L", "P", "RGBX", "RGBA", "CMYK", "I;16", "I;16B")
  225.  
  226. ##
  227. # Gets the "base" mode for given mode.  This function returns "L" for
  228. # images that contain grayscale data, and "RGB" for images that
  229. # contain color data.
  230. #
  231. # @param mode Input mode.
  232. # @return "L" or "RGB".
  233. # @exception KeyError If the input mode was not a standard mode.
  234.  
  235. def getmodebase(mode):
  236.     return ImageMode.getmode(mode).basemode
  237.  
  238. ##
  239. # Gets the storage type mode.  Given a mode, this function returns a
  240. # single-layer mode suitable for storing individual bands.
  241. #
  242. # @param mode Input mode.
  243. # @return "L", "I", or "F".
  244. # @exception KeyError If the input mode was not a standard mode.
  245.  
  246. def getmodetype(mode):
  247.     return ImageMode.getmode(mode).basetype
  248.  
  249. ##
  250. # Gets a list of individual band names.  Given a mode, this function
  251. # returns a tuple containing the names of individual bands (use
  252. # {@link #getmodetype} to get the mode used to store each individual
  253. # band.
  254. #
  255. # @param mode Input mode.
  256. # @return A tuple containing band names.  The length of the tuple
  257. #     gives the number of bands in an image of the given mode.
  258. # @exception KeyError If the input mode was not a standard mode.
  259.  
  260. def getmodebandnames(mode):
  261.     return ImageMode.getmode(mode).bands
  262.  
  263. ##
  264. # Gets the number of individual bands for this mode.
  265. #
  266. # @param mode Input mode.
  267. # @return The number of bands in this mode.
  268. # @exception KeyError If the input mode was not a standard mode.
  269.  
  270. def getmodebands(mode):
  271.     return len(ImageMode.getmode(mode).bands)
  272.  
  273. # --------------------------------------------------------------------
  274. # Helpers
  275.  
  276. _initialized = 0
  277.  
  278. ##
  279. # Explicitly loads standard file format drivers.
  280.  
  281. def preinit():
  282.     "Load standard file format drivers."
  283.  
  284.     global _initialized
  285.     if _initialized >= 1:
  286.         return
  287.  
  288.     try:
  289.         import BmpImagePlugin
  290.     except ImportError:
  291.         pass
  292.     try:
  293.         import GifImagePlugin
  294.     except ImportError:
  295.         pass
  296.     try:
  297.         import JpegImagePlugin
  298.     except ImportError:
  299.         pass
  300.     try:
  301.         import PpmImagePlugin
  302.     except ImportError:
  303.         pass
  304.     try:
  305.         import PngImagePlugin
  306.     except ImportError:
  307.         pass
  308. #   try:
  309. #       import TiffImagePlugin
  310. #   except ImportError:
  311. #       pass
  312.  
  313.     _initialized = 1
  314.  
  315. ##
  316. # Explicitly initializes the Python Imaging Library.  This function
  317. # loads all available file format drivers.
  318.  
  319. def init():
  320.     "Load all file format drivers."
  321.  
  322.     global _initialized
  323.     if _initialized >= 2:
  324.         return
  325.  
  326.     visited = {}
  327.  
  328.     directories = sys.path
  329.  
  330.     try:
  331.         directories = directories + [os.path.dirname(__file__)]
  332.     except NameError:
  333.         pass
  334.  
  335.     # only check directories (including current, if present in the path)
  336.     for directory in filter(isDirectory, directories):
  337.         fullpath = os.path.abspath(directory)
  338.         if visited.has_key(fullpath):
  339.             continue
  340.         for file in os.listdir(directory):
  341.             if file[-14:] == "ImagePlugin.py":
  342.                 f, e = os.path.splitext(file)
  343.                 try:
  344.                     sys.path.insert(0, directory)
  345.                     try:
  346.                         __import__(f, globals(), locals(), [])
  347.                     finally:
  348.                         del sys.path[0]
  349.                 except ImportError:
  350.                     if DEBUG:
  351.                         print "Image: failed to import",
  352.                         print f, ":", sys.exc_value
  353.         visited[fullpath] = None
  354.  
  355.     if OPEN or SAVE:
  356.         _initialized = 2
  357.  
  358.  
  359. # --------------------------------------------------------------------
  360. # Codec factories (used by tostring/fromstring and ImageFile.load)
  361.  
  362. def _getdecoder(mode, decoder_name, args, extra=()):
  363.  
  364.     # tweak arguments
  365.     if args is None:
  366.         args = ()
  367.     elif not isTupleType(args):
  368.         args = (args,)
  369.  
  370.     try:
  371.         # get decoder
  372.         decoder = getattr(core, decoder_name + "_decoder")
  373.         # print decoder, (mode,) + args + extra
  374.         return apply(decoder, (mode,) + args + extra)
  375.     except AttributeError:
  376.         raise IOError("decoder %s not available" % decoder_name)
  377.  
  378. def _getencoder(mode, encoder_name, args, extra=()):
  379.  
  380.     # tweak arguments
  381.     if args is None:
  382.         args = ()
  383.     elif not isTupleType(args):
  384.         args = (args,)
  385.  
  386.     try:
  387.         # get encoder
  388.         encoder = getattr(core, encoder_name + "_encoder")
  389.         # print encoder, (mode,) + args + extra
  390.         return apply(encoder, (mode,) + args + extra)
  391.     except AttributeError:
  392.         raise IOError("encoder %s not available" % encoder_name)
  393.  
  394.  
  395. # --------------------------------------------------------------------
  396. # Simple expression analyzer
  397.  
  398. class _E:
  399.     def __init__(self, data): self.data = data
  400.     def __coerce__(self, other): return self, _E(other)
  401.     def __add__(self, other): return _E((self.data, "__add__", other.data))
  402.     def __mul__(self, other): return _E((self.data, "__mul__", other.data))
  403.  
  404. def _getscaleoffset(expr):
  405.     stub = ["stub"]
  406.     data = expr(_E(stub)).data
  407.     try:
  408.         (a, b, c) = data # simplified syntax
  409.         if (a is stub and b == "__mul__" and isNumberType(c)):
  410.             return c, 0.0
  411.         if (a is stub and b == "__add__" and isNumberType(c)):
  412.             return 1.0, c
  413.     except TypeError: pass
  414.     try:
  415.         ((a, b, c), d, e) = data # full syntax
  416.         if (a is stub and b == "__mul__" and isNumberType(c) and
  417.             d == "__add__" and isNumberType(e)):
  418.             return c, e
  419.     except TypeError: pass
  420.     raise ValueError("illegal expression")
  421.  
  422.  
  423. # --------------------------------------------------------------------
  424. # Implementation wrapper
  425.  
  426. ##
  427. # This class represents an image object.  To create Image objects, use
  428. # the appropriate factory functions.  There's hardly ever any reason
  429. # to call the Image constructor directly.
  430. #
  431. # @see #open
  432. # @see #new
  433. # @see #fromstring
  434.  
  435. class Image:
  436.  
  437.     format = None
  438.     format_description = None
  439.  
  440.     def __init__(self):
  441.         self.im = None
  442.         self.mode = ""
  443.         self.size = (0, 0)
  444.         self.palette = None
  445.         self.info = {}
  446.         self.category = NORMAL
  447.         self.readonly = 0
  448.  
  449.     def _new(self, im):
  450.         new = Image()
  451.         new.im = im
  452.         new.mode = im.mode
  453.         new.size = im.size
  454.         new.palette = self.palette
  455.         if im.mode == "P":
  456.             new.palette = ImagePalette.ImagePalette()
  457.         try:
  458.             new.info = self.info.copy()
  459.         except AttributeError:
  460.             # fallback (pre-1.5.2)
  461.             new.info = {}
  462.             for k, v in self.info:
  463.                 new.info[k] = v
  464.         return new
  465.  
  466.     _makeself = _new # compatibility
  467.  
  468.     def _copy(self):
  469.         self.load()
  470.         self.im = self.im.copy()
  471.         self.readonly = 0
  472.  
  473.     def _dump(self, file=None, format=None):
  474.         import tempfile
  475.         if not file:
  476.             file = tempfile.mktemp()
  477.         self.load()
  478.         if not format or format == "PPM":
  479.             self.im.save_ppm(file)
  480.         else:
  481.             file = file + "." + format
  482.             self.save(file, format)
  483.         return file
  484.  
  485.     def __getattr__(self, name):
  486.         if name == "__array_interface__":
  487.             # numpy array interface support
  488.             new = {}
  489.             shape, typestr = _conv_type_shape(self)
  490.             new['shape'] = shape
  491.             new['typestr'] = typestr
  492.             new['data'] = self.tostring()
  493.             return new
  494.         raise AttributeError(name)
  495.  
  496.     ##
  497.     # Returns a string containing pixel data.
  498.     #
  499.     # @param encoder_name What encoder to use.  The default is to
  500.     #    use the standard "raw" encoder.
  501.     # @param *args Extra arguments to the encoder.
  502.     # @return An 8-bit string.
  503.  
  504.     def tostring(self, encoder_name="raw", *args):
  505.         "Return image as a binary string"
  506.  
  507.         # may pass tuple instead of argument list
  508.         if len(args) == 1 and isTupleType(args[0]):
  509.             args = args[0]
  510.  
  511.         if encoder_name == "raw" and args == ():
  512.             args = self.mode
  513.  
  514.         self.load()
  515.  
  516.         # unpack data
  517.         e = _getencoder(self.mode, encoder_name, args)
  518.         e.setimage(self.im)
  519.  
  520.         bufsize = max(65536, self.size[0] * 4) # see RawEncode.c
  521.  
  522.         data = []
  523.         while 1:
  524.             l, s, d = e.encode(bufsize)
  525.             data.append(d)
  526.             if s:
  527.                 break
  528.         if s < 0:
  529.             raise RuntimeError("encoder error %d in tostring" % s)
  530.  
  531.         return string.join(data, "")
  532.  
  533.     ##
  534.     # Returns the image converted to an X11 bitmap.  This method
  535.     # only works for mode "1" images.
  536.     #
  537.     # @param name The name prefix to use for the bitmap variables.
  538.     # @return A string containing an X11 bitmap.
  539.     # @exception ValueError If the mode is not "1"
  540.  
  541.     def tobitmap(self, name="image"):
  542.         "Return image as an XBM bitmap"
  543.  
  544.         self.load()
  545.         if self.mode != "1":
  546.             raise ValueError("not a bitmap")
  547.         data = self.tostring("xbm")
  548.         return string.join(["#define %s_width %d\n" % (name, self.size[0]),
  549.                 "#define %s_height %d\n"% (name, self.size[1]),
  550.                 "static char %s_bits[] = {\n" % name, data, "};"], "")
  551.  
  552.     ##
  553.     # Loads this image with pixel data from a string.
  554.     # <p>
  555.     # This method is similar to the {@link #fromstring} function, but
  556.     # loads data into this image instead of creating a new image
  557.     # object.
  558.  
  559.     def fromstring(self, data, decoder_name="raw", *args):
  560.         "Load data to image from binary string"
  561.  
  562.         # may pass tuple instead of argument list
  563.         if len(args) == 1 and isTupleType(args[0]):
  564.             args = args[0]
  565.  
  566.         # default format
  567.         if decoder_name == "raw" and args == ():
  568.             args = self.mode
  569.  
  570.         # unpack data
  571.         d = _getdecoder(self.mode, decoder_name, args)
  572.         d.setimage(self.im)
  573.         s = d.decode(data)
  574.  
  575.         if s[0] >= 0:
  576.             raise ValueError("not enough image data")
  577.         if s[1] != 0:
  578.             raise ValueError("cannot decode image data")
  579.  
  580.     ##
  581.     # Allocates storage for the image and loads the pixel data.  In
  582.     # normal cases, you don't need to call this method, since the
  583.     # Image class automatically loads an opened image when it is
  584.     # accessed for the first time.
  585.     #
  586.     # @return An image access object.
  587.  
  588.     def load(self):
  589.         "Explicitly load pixel data."
  590.         if self.im and self.palette and self.palette.dirty:
  591.             # realize palette
  592.             apply(self.im.putpalette, self.palette.getdata())
  593.             self.palette.dirty = 0
  594.             self.palette.mode = "RGB"
  595.             self.palette.rawmode = None
  596.             if self.info.has_key("transparency"):
  597.                 self.im.putpalettealpha(self.info["transparency"], 0)
  598.                 self.palette.mode = "RGBA"
  599.         if self.im:
  600.             return self.im.pixel_access(self.readonly)
  601.  
  602.     ##
  603.     # Verifies the contents of a file. For data read from a file, this
  604.     # method attempts to determine if the file is broken, without
  605.     # actually decoding the image data.  If this method finds any
  606.     # problems, it raises suitable exceptions.  If you need to load
  607.     # the image after using this method, you must reopen the image
  608.     # file.
  609.  
  610.     def verify(self):
  611.         "Verify file contents."
  612.         pass
  613.  
  614.  
  615.     ##
  616.     # Returns a converted copy of this image. For the "P" mode, this
  617.     # method translates pixels through the palette.  If mode is
  618.     # omitted, a mode is chosen so that all information in the image
  619.     # and the palette can be represented without a palette.
  620.     # <p>
  621.     # The current version supports all possible conversions between
  622.     # "L", "RGB" and "CMYK."
  623.     # <p>
  624.     # When translating a colour image to black and white (mode "L"),
  625.     # the library uses the ITU-R 601-2 luma transform:
  626.     # <p>
  627.     # <b>L = R * 299/1000 + G * 587/1000 + B * 114/1000</b>
  628.     # <p>
  629.     # When translating a greyscale image into a bilevel image (mode
  630.     # "1"), all non-zero values are set to 255 (white). To use other
  631.     # thresholds, use the {@link #Image.point} method.
  632.     #
  633.     # @def convert(mode, matrix=None)
  634.     # @param mode The requested mode.
  635.     # @param matrix An optional conversion matrix.  If given, this
  636.     #    should be 4- or 16-tuple containing floating point values.
  637.     # @return An Image object.
  638.  
  639.     def convert(self, mode=None, data=None, dither=None,
  640.                 palette=WEB, colors=256):
  641.         "Convert to other pixel format"
  642.  
  643.         if not mode:
  644.             # determine default mode
  645.             if self.mode == "P":
  646.                 self.load()
  647.                 if self.palette:
  648.                     mode = self.palette.mode
  649.                 else:
  650.                     mode = "RGB"
  651.             else:
  652.                 return self.copy()
  653.  
  654.         self.load()
  655.  
  656.         if data:
  657.             # matrix conversion
  658.             if mode not in ("L", "RGB"):
  659.                 raise ValueError("illegal conversion")
  660.             im = self.im.convert_matrix(mode, data)
  661.             return self._new(im)
  662.  
  663.         if mode == "P" and palette == ADAPTIVE:
  664.             im = self.im.quantize(colors)
  665.             return self._new(im)
  666.  
  667.         # colourspace conversion
  668.         if dither is None:
  669.             dither = FLOYDSTEINBERG
  670.  
  671.         try:
  672.             im = self.im.convert(mode, dither)
  673.         except ValueError:
  674.             try:
  675.                 # normalize source image and try again
  676.                 im = self.im.convert(getmodebase(self.mode))
  677.                 im = im.convert(mode, dither)
  678.             except KeyError:
  679.                 raise ValueError("illegal conversion")
  680.  
  681.         return self._new(im)
  682.  
  683.     def quantize(self, colors=256, method=0, kmeans=0, palette=None):
  684.  
  685.         # methods:
  686.         #    0 = median cut
  687.         #    1 = maximum coverage
  688.  
  689.         # NOTE: this functionality will be moved to the extended
  690.         # quantizer interface in a later version of PIL.
  691.  
  692.         self.load()
  693.  
  694.         if palette:
  695.             # use palette from reference image
  696.             palette.load()
  697.             if palette.mode != "P":
  698.                 raise ValueError("bad mode for palette image")
  699.             if self.mode != "RGB" and self.mode != "L":
  700.                 raise ValueError(
  701.                     "only RGB or L mode images can be quantized to a palette"
  702.                     )
  703.             im = self.im.convert("P", 1, palette.im)
  704.             return self._makeself(im)
  705.  
  706.         im = self.im.quantize(colors, method, kmeans)
  707.         return self._new(im)
  708.  
  709.     ##
  710.     # Copies this image. Use this method if you wish to paste things
  711.     # into an image, but still retain the original.
  712.     #
  713.     # @return An Image object.
  714.  
  715.     def copy(self):
  716.         "Copy raster data"
  717.  
  718.         self.load()
  719.         im = self.im.copy()
  720.         return self._new(im)
  721.  
  722.     ##
  723.     # Returns a rectangular region from this image. The box is a
  724.     # 4-tuple defining the left, upper, right, and lower pixel
  725.     # coordinate.
  726.     # <p>
  727.     # This is a lazy operation.  Changes to the source image may or
  728.     # may not be reflected in the cropped image.  To break the
  729.     # connection, call the {@link #Image.load} method on the cropped
  730.     # copy.
  731.     #
  732.     # @param The crop rectangle, as a (left, upper, right, lower)-tuple.
  733.     # @return An Image object.
  734.  
  735.     def crop(self, box=None):
  736.         "Crop region from image"
  737.  
  738.         self.load()
  739.         if box is None:
  740.             return self.copy()
  741.  
  742.         # lazy operation
  743.         return _ImageCrop(self, box)
  744.  
  745.     ##
  746.     # Configures the image file loader so it returns a version of the
  747.     # image that as closely as possible matches the given mode and
  748.     # size.  For example, you can use this method to convert a colour
  749.     # JPEG to greyscale while loading it, or to extract a 128x192
  750.     # version from a PCD file.
  751.     # <p>
  752.     # Note that this method modifies the Image object in place.  If
  753.     # the image has already been loaded, this method has no effect.
  754.     #
  755.     # @param mode The requested mode.
  756.     # @param size The requested size.
  757.  
  758.     def draft(self, mode, size):
  759.         "Configure image decoder"
  760.  
  761.         pass
  762.  
  763.     def _expand(self, xmargin, ymargin=None):
  764.         if ymargin is None:
  765.             ymargin = xmargin
  766.         self.load()
  767.         return self._new(self.im.expand(xmargin, ymargin, 0))
  768.  
  769.     ##
  770.     # Filters this image using the given filter.  For a list of
  771.     # available filters, see the <b>ImageFilter</b> module.
  772.     #
  773.     # @param filter Filter kernel.
  774.     # @return An Image object.
  775.     # @see ImageFilter
  776.  
  777.     def filter(self, filter):
  778.         "Apply environment filter to image"
  779.  
  780.         self.load()
  781.  
  782.         from ImageFilter import Filter
  783.         if not isinstance(filter, Filter):
  784.             filter = filter()
  785.  
  786.         if self.im.bands == 1:
  787.             return self._new(filter.filter(self.im))
  788.         # fix to handle multiband images since _imaging doesn't
  789.         ims = []
  790.         for c in range(self.im.bands):
  791.             ims.append(self._new(filter.filter(self.im.getband(c))))
  792.         return merge(self.mode, ims)
  793.  
  794.     ##
  795.     # Returns a tuple containing the name of each band in this image.
  796.     # For example, <b>getbands</b> on an RGB image returns ("R", "G", "B").
  797.     #
  798.     # @return A tuple containing band names.
  799.  
  800.     def getbands(self):
  801.         "Get band names"
  802.  
  803.         return ImageMode.getmode(self.mode).bands
  804.  
  805.     ##
  806.     # Calculates the bounding box of the non-zero regions in the
  807.     # image.
  808.     #
  809.     # @return The bounding box is returned as a 4-tuple defining the
  810.     #    left, upper, right, and lower pixel coordinate. If the image
  811.     #    is completely empty, this method returns None.
  812.  
  813.     def getbbox(self):
  814.         "Get bounding box of actual data (non-zero pixels) in image"
  815.  
  816.         self.load()
  817.         return self.im.getbbox()
  818.  
  819.     ##
  820.     # Returns a list of colors used in this image.
  821.     #
  822.     # @param maxcolors Maximum number of colors.  If this number is
  823.     #    exceeded, this method returns None.  The default limit is
  824.     #    256 colors.
  825.     # @return An unsorted list of (count, pixel) values.
  826.  
  827.     def getcolors(self, maxcolors=256):
  828.         "Get colors from image, up to given limit"
  829.  
  830.         self.load()
  831.         if self.mode in ("1", "L", "P"):
  832.             h = self.im.histogram()
  833.             out = []
  834.             for i in range(256):
  835.                 if h[i]:
  836.                     out.append((h[i], i))
  837.             if len(out) > maxcolors:
  838.                 return None
  839.             return out
  840.         return self.im.getcolors(maxcolors)
  841.  
  842.     ##
  843.     # Returns the contents of this image as a sequence object
  844.     # containing pixel values.  The sequence object is flattened, so
  845.     # that values for line one follow directly after the values of
  846.     # line zero, and so on.
  847.     # <p>
  848.     # Note that the sequence object returned by this method is an
  849.     # internal PIL data type, which only supports certain sequence
  850.     # operations.  To convert it to an ordinary sequence (e.g. for
  851.     # printing), use <b>list(im.getdata())</b>.
  852.     #
  853.     # @param band What band to return.  The default is to return
  854.     #    all bands.  To return a single band, pass in the index
  855.     #    value (e.g. 0 to get the "R" band from an "RGB" image).
  856.     # @return A sequence-like object.
  857.  
  858.     def getdata(self, band = None):
  859.         "Get image data as sequence object."
  860.  
  861.         self.load()
  862.         if band is not None:
  863.             return self.im.getband(band)
  864.         return self.im # could be abused
  865.  
  866.     ##
  867.     # Gets the the minimum and maximum pixel values for each band in
  868.     # the image.
  869.     #
  870.     # @return For a single-band image, a 2-tuple containing the
  871.     #    minimum and maximum pixel value.  For a multi-band image,
  872.     #    a tuple containing one 2-tuple for each band.
  873.  
  874.     def getextrema(self):
  875.         "Get min/max value"
  876.  
  877.         self.load()
  878.         if self.im.bands > 1:
  879.             extrema = []
  880.             for i in range(self.im.bands):
  881.                 extrema.append(self.im.getband(i).getextrema())
  882.             return tuple(extrema)
  883.         return self.im.getextrema()
  884.  
  885.     ##
  886.     # Returns a PyCObject that points to the internal image memory.
  887.     #
  888.     # @return A PyCObject object.
  889.  
  890.     def getim(self):
  891.         "Get PyCObject pointer to internal image memory"
  892.  
  893.         self.load()
  894.         return self.im.ptr
  895.  
  896.  
  897.     ##
  898.     # Returns the image palette as a list.
  899.     #
  900.     # @return A list of color values [r, g, b, ...], or None if the
  901.     #    image has no palette.
  902.  
  903.     def getpalette(self):
  904.         "Get palette contents."
  905.  
  906.         self.load()
  907.         try:
  908.             return map(ord, self.im.getpalette())
  909.         except ValueError:
  910.             return None # no palette
  911.  
  912.  
  913.     ##
  914.     # Returns the pixel value at a given position.
  915.     #
  916.     # @param xy The coordinate, given as (x, y).
  917.     # @return The pixel value.  If the image is a multi-layer image,
  918.     #    this method returns a tuple.
  919.  
  920.     def getpixel(self, xy):
  921.         "Get pixel value"
  922.  
  923.         self.load()
  924.         return self.im.getpixel(xy)
  925.  
  926.     ##
  927.     # Returns the horizontal and vertical projection.
  928.     #
  929.     # @return Two sequences, indicating where there are non-zero
  930.     #     pixels along the X-axis and the Y-axis, respectively.
  931.  
  932.     def getprojection(self):
  933.         "Get projection to x and y axes"
  934.  
  935.         self.load()
  936.         x, y = self.im.getprojection()
  937.         return map(ord, x), map(ord, y)
  938.  
  939.     ##
  940.     # Returns a histogram for the image. The histogram is returned as
  941.     # a list of pixel counts, one for each pixel value in the source
  942.     # image. If the image has more than one band, the histograms for
  943.     # all bands are concatenated (for example, the histogram for an
  944.     # "RGB" image contains 768 values).
  945.     # <p>
  946.     # A bilevel image (mode "1") is treated as a greyscale ("L") image
  947.     # by this method.
  948.     # <p>
  949.     # If a mask is provided, the method returns a histogram for those
  950.     # parts of the image where the mask image is non-zero. The mask
  951.     # image must have the same size as the image, and be either a
  952.     # bi-level image (mode "1") or a greyscale image ("L").
  953.     #
  954.     # @def histogram(mask=None)
  955.     # @param mask An optional mask.
  956.     # @return A list containing pixel counts.
  957.  
  958.     def histogram(self, mask=None, extrema=None):
  959.         "Take histogram of image"
  960.  
  961.         self.load()
  962.         if mask:
  963.             mask.load()
  964.             return self.im.histogram((0, 0), mask.im)
  965.         if self.mode in ("I", "F"):
  966.             if extrema is None:
  967.                 extrema = self.getextrema()
  968.             return self.im.histogram(extrema)
  969.         return self.im.histogram()
  970.  
  971.     ##
  972.     # (Deprecated) Returns a copy of the image where the data has been
  973.     # offset by the given distances. Data wraps around the edges. If
  974.     # yoffset is omitted, it is assumed to be equal to xoffset.
  975.     # <p>
  976.     # This method is deprecated. New code should use the <b>offset</b>
  977.     # function in the <b>ImageChops</b> module.
  978.     #
  979.     # @param xoffset The horizontal distance.
  980.     # @param yoffset The vertical distance.  If omitted, both
  981.     #    distances are set to the same value.
  982.     # @return An Image object.
  983.  
  984.     def offset(self, xoffset, yoffset=None):
  985.         "(deprecated) Offset image in horizontal and/or vertical direction"
  986.         if warnings:
  987.             warnings.warn(
  988.                 "'offset' is deprecated; use 'ImageChops.offset' instead",
  989.                 DeprecationWarning, stacklevel=2
  990.                 )
  991.         import ImageChops
  992.         return ImageChops.offset(self, xoffset, yoffset)
  993.  
  994.     ##
  995.     # Pastes another image into this image. The box argument is either
  996.     # a 2-tuple giving the upper left corner, a 4-tuple defining the
  997.     # left, upper, right, and lower pixel coordinate, or None (same as
  998.     # (0, 0)).  If a 4-tuple is given, the size of the pasted image
  999.     # must match the size of the region.
  1000.     # <p>
  1001.     # If the modes don't match, the pasted image is converted to the
  1002.     # mode of this image (see the {@link #Image.convert} method for
  1003.     # details).
  1004.     # <p>
  1005.     # Instead of an image, the source can be a integer or tuple
  1006.     # containing pixel values.  The method then fills the region
  1007.     # with the given colour.  When creating RGB images, you can
  1008.     # also use colour strings as supported by the ImageColor module.
  1009.     # <p>
  1010.     # If a mask is given, this method updates only the regions
  1011.     # indicated by the mask.  You can use either "1", "L" or "RGBA"
  1012.     # images (in the latter case, the alpha band is used as mask).
  1013.     # Where the mask is 255, the given image is copied as is.  Where
  1014.     # the mask is 0, the current value is preserved.  Intermediate
  1015.     # values can be used for transparency effects.
  1016.     # <p>
  1017.     # Note that if you paste an "RGBA" image, the alpha band is
  1018.     # ignored.  You can work around this by using the same image as
  1019.     # both source image and mask.
  1020.     #
  1021.     # @param im Source image or pixel value (integer or tuple).
  1022.     # @param box An optional 4-tuple giving the region to paste into.
  1023.     #    If a 2-tuple is used instead, it's treated as the upper left
  1024.     #    corner.  If omitted or None, the source is pasted into the
  1025.     #    upper left corner.
  1026.     #    <p>
  1027.     #    If an image is given as the second argument and there is no
  1028.     #    third, the box defaults to (0, 0), and the second argument
  1029.     #    is interpreted as a mask image.
  1030.     # @param mask An optional mask image.
  1031.     # @return An Image object.
  1032.  
  1033.     def paste(self, im, box=None, mask=None):
  1034.         "Paste other image into region"
  1035.  
  1036.         if isImageType(box) and mask is None:
  1037.             # abbreviated paste(im, mask) syntax
  1038.             mask = box; box = None
  1039.  
  1040.         if box is None:
  1041.             # cover all of self
  1042.             box = (0, 0) + self.size
  1043.  
  1044.         if len(box) == 2:
  1045.             # lower left corner given; get size from image or mask
  1046.             if isImageType(im):
  1047.                 size = im.size
  1048.             elif isImageType(mask):
  1049.                 size = mask.size
  1050.             else:
  1051.                 # FIXME: use self.size here?
  1052.                 raise ValueError(
  1053.                     "cannot determine region size; use 4-item box"
  1054.                     )
  1055.             box = box + (box[0]+size[0], box[1]+size[1])
  1056.  
  1057.         if isStringType(im):
  1058.             import ImageColor
  1059.             im = ImageColor.getcolor(im, self.mode)
  1060.  
  1061.         elif isImageType(im):
  1062.             im.load()
  1063.             if self.mode != im.mode:
  1064.                 if self.mode != "RGB" or im.mode not in ("RGBA", "RGBa"):
  1065.                     # should use an adapter for this!
  1066.                     im = im.convert(self.mode)
  1067.             im = im.im
  1068.  
  1069.         self.load()
  1070.         if self.readonly:
  1071.             self._copy()
  1072.  
  1073.         if mask:
  1074.             mask.load()
  1075.             self.im.paste(im, box, mask.im)
  1076.         else:
  1077.             self.im.paste(im, box)
  1078.  
  1079.     ##
  1080.     # Maps this image through a lookup table or function.
  1081.     #
  1082.     # @param lut A lookup table, containing 256 values per band in the
  1083.     #    image. A function can be used instead, it should take a single
  1084.     #    argument. The function is called once for each possible pixel
  1085.     #    value, and the resulting table is applied to all bands of the
  1086.     #    image.
  1087.     # @param mode Output mode (default is same as input).  In the
  1088.     #    current version, this can only be used if the source image
  1089.     #    has mode "L" or "P", and the output has mode "1".
  1090.     # @return An Image object.
  1091.  
  1092.     def point(self, lut, mode=None):
  1093.         "Map image through lookup table"
  1094.  
  1095.         self.load()
  1096.  
  1097.         if not isSequenceType(lut):
  1098.             # if it isn't a list, it should be a function
  1099.             if self.mode in ("I", "I;16", "F"):
  1100.                 # check if the function can be used with point_transform
  1101.                 scale, offset = _getscaleoffset(lut)
  1102.                 return self._new(self.im.point_transform(scale, offset))
  1103.             # for other modes, convert the function to a table
  1104.             lut = map(lut, range(256)) * self.im.bands
  1105.  
  1106.         if self.mode == "F":
  1107.             # FIXME: _imaging returns a confusing error message for this case
  1108.             raise ValueError("point operation not supported for this mode")
  1109.  
  1110.         return self._new(self.im.point(lut, mode))
  1111.  
  1112.     ##
  1113.     # Adds or replaces the alpha layer in this image.  If the image
  1114.     # does not have an alpha layer, it's converted to "LA" or "RGBA".
  1115.     # The new layer must be either "L" or "1".
  1116.     #
  1117.     # @param im The new alpha layer.  This can either be an "L" or "1"
  1118.     #    image having the same size as this image, or an integer or
  1119.     #    other color value.
  1120.  
  1121.     def putalpha(self, alpha):
  1122.         "Set alpha layer"
  1123.  
  1124.         self.load()
  1125.         if self.readonly:
  1126.             self._copy()
  1127.  
  1128.         if self.mode not in ("LA", "RGBA"):
  1129.             # attempt to promote self to a matching alpha mode
  1130.             try:
  1131.                 mode = getmodebase(self.mode) + "A"
  1132.                 try:
  1133.                     self.im.setmode(mode)
  1134.                 except (AttributeError, ValueError):
  1135.                     # do things the hard way
  1136.                     im = self.im.convert(mode)
  1137.                     if im.mode not in ("LA", "RGBA"):
  1138.                         raise ValueError # sanity check
  1139.                     self.im = im
  1140.                 self.mode = self.im.mode
  1141.             except (KeyError, ValueError):
  1142.                 raise ValueError("illegal image mode")
  1143.  
  1144.         if self.mode == "LA":
  1145.             band = 1
  1146.         else:
  1147.             band = 3
  1148.  
  1149.         if isImageType(alpha):
  1150.             # alpha layer
  1151.             if alpha.mode not in ("1", "L"):
  1152.                 raise ValueError("illegal image mode")
  1153.             alpha.load()
  1154.             if alpha.mode == "1":
  1155.                 alpha = alpha.convert("L")
  1156.         else:
  1157.             # constant alpha
  1158.             try:
  1159.                 self.im.fillband(band, alpha)
  1160.             except (AttributeError, ValueError):
  1161.                 # do things the hard way
  1162.                 alpha = new("L", self.size, alpha)
  1163.             else:
  1164.                 return
  1165.  
  1166.         self.im.putband(alpha.im, band)
  1167.  
  1168.     ##
  1169.     # Copies pixel data to this image.  This method copies data from a
  1170.     # sequence object into the image, starting at the upper left
  1171.     # corner (0, 0), and continuing until either the image or the
  1172.     # sequence ends.  The scale and offset values are used to adjust
  1173.     # the sequence values: <b>pixel = value*scale + offset</b>.
  1174.     #
  1175.     # @param data A sequence object.
  1176.     # @param scale An optional scale value.  The default is 1.0.
  1177.     # @param offset An optional offset value.  The default is 0.0.
  1178.  
  1179.     def putdata(self, data, scale=1.0, offset=0.0):
  1180.         "Put data from a sequence object into an image."
  1181.  
  1182.         self.load()
  1183.         if self.readonly:
  1184.             self._copy()
  1185.  
  1186.         self.im.putdata(data, scale, offset)
  1187.  
  1188.     ##
  1189.     # Attaches a palette to this image.  The image must be a "P" or
  1190.     # "L" image, and the palette sequence must contain 768 integer
  1191.     # values, where each group of three values represent the red,
  1192.     # green, and blue values for the corresponding pixel
  1193.     # index. Instead of an integer sequence, you can use an 8-bit
  1194.     # string.
  1195.     #
  1196.     # @def putpalette(data)
  1197.     # @param data A palette sequence (either a list or a string).
  1198.  
  1199.     def putpalette(self, data, rawmode="RGB"):
  1200.         "Put palette data into an image."
  1201.  
  1202.         self.load()
  1203.         if self.mode not in ("L", "P"):
  1204.             raise ValueError("illegal image mode")
  1205.         if not isStringType(data):
  1206.             data = string.join(map(chr, data), "")
  1207.         self.mode = "P"
  1208.         self.palette = ImagePalette.raw(rawmode, data)
  1209.         self.palette.mode = "RGB"
  1210.         self.load() # install new palette
  1211.  
  1212.     ##
  1213.     # Modifies the pixel at the given position. The colour is given as
  1214.     # a single numerical value for single-band images, and a tuple for
  1215.     # multi-band images.
  1216.     # <p>
  1217.     # Note that this method is relatively slow.  For more extensive
  1218.     # changes, use {@link #Image.paste} or the <b>ImageDraw</b> module
  1219.     # instead.
  1220.     #
  1221.     # @param xy The pixel coordinate, given as (x, y).
  1222.     # @param value The pixel value.
  1223.     # @see #Image.paste
  1224.     # @see #Image.putdata
  1225.     # @see ImageDraw
  1226.  
  1227.     def putpixel(self, xy, value):
  1228.         "Set pixel value"
  1229.  
  1230.         self.load()
  1231.         if self.readonly:
  1232.             self._copy()
  1233.  
  1234.         return self.im.putpixel(xy, value)
  1235.  
  1236.     ##
  1237.     # Returns a resized copy of this image.
  1238.     #
  1239.     # @def resize(size, filter=NEAREST)
  1240.     # @param size The requested size in pixels, as a 2-tuple:
  1241.     #    (width, height).
  1242.     # @param filter An optional resampling filter.  This can be
  1243.     #    one of <b>NEAREST</b> (use nearest neighbour), <b>BILINEAR</b>
  1244.     #    (linear interpolation in a 2x2 environment), <b>BICUBIC</b>
  1245.     #    (cubic spline interpolation in a 4x4 environment), or
  1246.     #    <b>ANTIALIAS</b> (a high-quality downsampling filter).
  1247.     #    If omitted, or if the image has mode "1" or "P", it is
  1248.     #    set <b>NEAREST</b>.
  1249.     # @return An Image object.
  1250.  
  1251.     def resize(self, size, resample=NEAREST):
  1252.         "Resize image"
  1253.  
  1254.         if resample not in (NEAREST, BILINEAR, BICUBIC, ANTIALIAS):
  1255.             raise ValueError("unknown resampling filter")
  1256.  
  1257.         self.load()
  1258.  
  1259.         if self.mode in ("1", "P"):
  1260.             resample = NEAREST
  1261.  
  1262.         if resample == ANTIALIAS:
  1263.             # requires stretch support (imToolkit & PIL 1.1.3)
  1264.             try:
  1265.                 im = self.im.stretch(size, resample)
  1266.             except AttributeError:
  1267.                 raise ValueError("unsupported resampling filter")
  1268.         else:
  1269.             im = self.im.resize(size, resample)
  1270.  
  1271.         return self._new(im)
  1272.  
  1273.     ##
  1274.     # Returns a rotated copy of this image.  This method returns a
  1275.     # copy of this image, rotated the given number of degrees counter
  1276.     # clockwise around its centre.
  1277.     #
  1278.     # @def rotate(angle, filter=NEAREST)
  1279.     # @param angle In degrees counter clockwise.
  1280.     # @param filter An optional resampling filter.  This can be
  1281.     #    one of <b>NEAREST</b> (use nearest neighbour), <b>BILINEAR</b>
  1282.     #    (linear interpolation in a 2x2 environment), or <b>BICUBIC</b>
  1283.     #    (cubic spline interpolation in a 4x4 environment).
  1284.     #    If omitted, or if the image has mode "1" or "P", it is
  1285.     #    set <b>NEAREST</b>.
  1286.     # @param expand Optional expansion flag.  If true, expands the output
  1287.     #    image to make it large enough to hold the entire rotated image.
  1288.     #    If false or omitted, make the output image the same size as the
  1289.     #    input image.
  1290.     # @return An Image object.
  1291.  
  1292.     def rotate(self, angle, resample=NEAREST, expand=0):
  1293.         "Rotate image.  Angle given as degrees counter-clockwise."
  1294.  
  1295.         if expand:
  1296.             import math
  1297.             angle = -angle * math.pi / 180
  1298.             matrix = [
  1299.                  math.cos(angle), math.sin(angle), 0.0,
  1300.                 -math.sin(angle), math.cos(angle), 0.0
  1301.                  ]
  1302.             def transform(x, y, (a, b, c, d, e, f)=matrix):
  1303.                 return a*x + b*y + c, d*x + e*y + f
  1304.  
  1305.             # calculate output size
  1306.             w, h = self.size
  1307.             xx = []
  1308.             yy = []
  1309.             for x, y in ((0, 0), (w, 0), (w, h), (0, h)):
  1310.                 x, y = transform(x, y)
  1311.                 xx.append(x)
  1312.                 yy.append(y)
  1313.             w = int(math.ceil(max(xx)) - math.floor(min(xx)))
  1314.             h = int(math.ceil(max(yy)) - math.floor(min(yy)))
  1315.  
  1316.             # adjust center
  1317.             x, y = transform(w / 2.0, h / 2.0)
  1318.             matrix[2] = self.size[0] / 2.0 - x
  1319.             matrix[5] = self.size[1] / 2.0 - y
  1320.  
  1321.             return self.transform((w, h), AFFINE, matrix)
  1322.  
  1323.         if resample not in (NEAREST, BILINEAR, BICUBIC):
  1324.             raise ValueError("unknown resampling filter")
  1325.  
  1326.         self.load()
  1327.  
  1328.         if self.mode in ("1", "P"):
  1329.             resample = NEAREST
  1330.  
  1331.         return self._new(self.im.rotate(angle, resample))
  1332.  
  1333.     ##
  1334.     # Saves this image under the given filename.  If no format is
  1335.     # specified, the format to use is determined from the filename
  1336.     # extension, if possible.
  1337.     # <p>
  1338.     # Keyword options can be used to provide additional instructions
  1339.     # to the writer. If a writer doesn't recognise an option, it is
  1340.     # silently ignored. The available options are described later in
  1341.     # this handbook.
  1342.     # <p>
  1343.     # You can use a file object instead of a filename. In this case,
  1344.     # you must always specify the format. The file object must
  1345.     # implement the <b>seek</b>, <b>tell</b>, and <b>write</b>
  1346.     # methods, and be opened in binary mode.
  1347.     #
  1348.     # @def save(file, format=None, **options)
  1349.     # @param file File name or file object.
  1350.     # @param format Optional format override.  If omitted, the
  1351.     #    format to use is determined from the filename extension.
  1352.     #    If a file object was used instead of a filename, this
  1353.     #    parameter should always be used.
  1354.     # @param **options Extra parameters to the image writer.
  1355.     # @return None
  1356.     # @exception KeyError If the output format could not be determined
  1357.     #    from the file name.  Use the format option to solve this.
  1358.     # @exception IOError If the file could not be written.  The file
  1359.     #    may have been created, and may contain partial data.
  1360.  
  1361.     def save(self, fp, format=None, **params):
  1362.         "Save image to file or stream"
  1363.  
  1364.         if isStringType(fp):
  1365.             filename = fp
  1366.         else:
  1367.             if hasattr(fp, "name") and isStringType(fp.name):
  1368.                 filename = fp.name
  1369.             else:
  1370.                 filename = ""
  1371.  
  1372.         # may mutate self!
  1373.         self.load()
  1374.  
  1375.         self.encoderinfo = params
  1376.         self.encoderconfig = ()
  1377.  
  1378.         preinit()
  1379.  
  1380.         ext = string.lower(os.path.splitext(filename)[1])
  1381.  
  1382.         if not format:
  1383.             try:
  1384.                 format = EXTENSION[ext]
  1385.             except KeyError:
  1386.                 init()
  1387.                 try:
  1388.                     format = EXTENSION[ext]
  1389.                 except KeyError:
  1390.                     raise KeyError(ext) # unknown extension
  1391.  
  1392.         try:
  1393.             save_handler = SAVE[string.upper(format)]
  1394.         except KeyError:
  1395.             init()
  1396.             save_handler = SAVE[string.upper(format)] # unknown format
  1397.  
  1398.         if isStringType(fp):
  1399.             import __builtin__
  1400.             fp = __builtin__.open(fp, "wb")
  1401.             close = 1
  1402.         else:
  1403.             close = 0
  1404.  
  1405.         try:
  1406.             save_handler(self, fp, filename)
  1407.         finally:
  1408.             # do what we can to clean up
  1409.             if close:
  1410.                 fp.close()
  1411.  
  1412.     ##
  1413.     # Seeks to the given frame in this sequence file. If you seek
  1414.     # beyond the end of the sequence, the method raises an
  1415.     # <b>EOFError</b> exception. When a sequence file is opened, the
  1416.     # library automatically seeks to frame 0.
  1417.     # <p>
  1418.     # Note that in the current version of the library, most sequence
  1419.     # formats only allows you to seek to the next frame.
  1420.     #
  1421.     # @param frame Frame number, starting at 0.
  1422.     # @exception EOFError If the call attempts to seek beyond the end
  1423.     #     of the sequence.
  1424.     # @see #Image.tell
  1425.  
  1426.     def seek(self, frame):
  1427.         "Seek to given frame in sequence file"
  1428.  
  1429.         # overridden by file handlers
  1430.         if frame != 0:
  1431.             raise EOFError
  1432.  
  1433.     ##
  1434.     # Displays this image. This method is mainly intended for
  1435.     # debugging purposes.
  1436.     # <p>
  1437.     # On Unix platforms, this method saves the image to a temporary
  1438.     # PPM file, and calls the <b>xv</b> utility.
  1439.     # <p>
  1440.     # On Windows, it saves the image to a temporary BMP file, and uses
  1441.     # the standard BMP display utility to show it (usually Paint).
  1442.     #
  1443.     # @def show(title=None)
  1444.     # @param title Optional title to use for the image window,
  1445.     #    where possible.
  1446.  
  1447.     def show(self, title=None, command=None):
  1448.         "Display image (for debug purposes only)"
  1449.  
  1450.         _showxv(self, title, command)
  1451.  
  1452.     ##
  1453.     # Split this image into individual bands. This method returns a
  1454.     # tuple of individual image bands from an image. For example,
  1455.     # splitting an "RGB" image creates three new images each
  1456.     # containing a copy of one of the original bands (red, green,
  1457.     # blue).
  1458.     #
  1459.     # @return A tuple containing bands.
  1460.  
  1461.     def split(self):
  1462.         "Split image into bands"
  1463.  
  1464.         ims = []
  1465.         self.load()
  1466.         for i in range(self.im.bands):
  1467.             ims.append(self._new(self.im.getband(i)))
  1468.         return tuple(ims)
  1469.  
  1470.     ##
  1471.     # Returns the current frame number.
  1472.     #
  1473.     # @return Frame number, starting with 0.
  1474.     # @see #Image.seek
  1475.  
  1476.     def tell(self):
  1477.         "Return current frame number"
  1478.  
  1479.         return 0
  1480.  
  1481.     ##
  1482.     # Make this image into a thumbnail.  This method modifies the
  1483.     # image to contain a thumbnail version of itself, no larger than
  1484.     # the given size.  This method calculates an appropriate thumbnail
  1485.     # size to preserve the aspect of the image, calls the {@link
  1486.     # #Image.draft} method to configure the file reader (where
  1487.     # applicable), and finally resizes the image.
  1488.     # <p>
  1489.     # Note that the bilinear and bicubic filters in the current
  1490.     # version of PIL are not well-suited for thumbnail generation.
  1491.     # You should use <b>ANTIALIAS</b> unless speed is much more
  1492.     # important than quality.
  1493.     # <p>
  1494.     # Also note that this function modifies the Image object in place.
  1495.     # If you need to use the full resolution image as well, apply this
  1496.     # method to a {@link #Image.copy} of the original image.
  1497.     #
  1498.     # @param size Requested size.
  1499.     # @param resample Optional resampling filter.  This can be one
  1500.     #    of <b>NEAREST</b>, <b>BILINEAR</b>, <b>BICUBIC</b>, or
  1501.     #    <b>ANTIALIAS</b> (best quality).  If omitted, it defaults
  1502.     #    to <b>NEAREST</b> (this will be changed to ANTIALIAS in a
  1503.     #    future version).
  1504.     # @return None
  1505.  
  1506.     def thumbnail(self, size, resample=NEAREST):
  1507.         "Create thumbnail representation (modifies image in place)"
  1508.  
  1509.         # FIXME: the default resampling filter will be changed
  1510.         # to ANTIALIAS in future versions
  1511.  
  1512.         # preserve aspect ratio
  1513.         x, y = self.size
  1514.         if x > size[0]: y = max(y * size[0] / x, 1); x = size[0]
  1515.         if y > size[1]: x = max(x * size[1] / y, 1); y = size[1]
  1516.         size = x, y
  1517.  
  1518.         if size == self.size:
  1519.             return
  1520.  
  1521.         self.draft(None, size)
  1522.  
  1523.         self.load()
  1524.  
  1525.         try:
  1526.             im = self.resize(size, resample)
  1527.         except ValueError:
  1528.             if resample != ANTIALIAS:
  1529.                 raise
  1530.             im = self.resize(size, NEAREST) # fallback
  1531.  
  1532.         self.im = im.im
  1533.         self.mode = im.mode
  1534.         self.size = size
  1535.  
  1536.         self.readonly = 0
  1537.  
  1538.     # FIXME: the different tranform methods need further explanation
  1539.     # instead of bloating the method docs, add a separate chapter.
  1540.  
  1541.     ##
  1542.     # Transforms this image.  This method creates a new image with the
  1543.     # given size, and the same mode as the original, and copies data
  1544.     # to the new image using the given transform.
  1545.     # <p>
  1546.     # @def transform(size, method, data, resample=NEAREST)
  1547.     # @param size The output size.
  1548.     # @param method The transformation method.  This is one of
  1549.     #   <b>EXTENT</b> (cut out a rectangular subregion), <b>AFFINE</b>
  1550.     #   (affine transform), <b>PERSPECTIVE</b> (perspective
  1551.     #   transform), <b>QUAD</b> (map a quadrilateral to a
  1552.     #   rectangle), or <b>MESH</b> (map a number of source quadrilaterals
  1553.     #   in one operation).
  1554.     # @param data Extra data to the transformation method.
  1555.     # @param resample Optional resampling filter.  It can be one of
  1556.     #    <b>NEAREST</b> (use nearest neighbour), <b>BILINEAR</b>
  1557.     #    (linear interpolation in a 2x2 environment), or
  1558.     #    <b>BICUBIC</b> (cubic spline interpolation in a 4x4
  1559.     #    environment). If omitted, or if the image has mode
  1560.     #    "1" or "P", it is set to <b>NEAREST</b>.
  1561.     # @return An Image object.
  1562.  
  1563.     def transform(self, size, method, data=None, resample=NEAREST, fill=1):
  1564.         "Transform image"
  1565.  
  1566.         import ImageTransform
  1567.         if isinstance(method, ImageTransform.Transform):
  1568.             method, data = method.getdata()
  1569.         if data is None:
  1570.             raise ValueError("missing method data")
  1571.         im = new(self.mode, size, None)
  1572.         if method == MESH:
  1573.             # list of quads
  1574.             for box, quad in data:
  1575.                 im.__transformer(box, self, QUAD, quad, resample, fill)
  1576.         else:
  1577.             im.__transformer((0, 0)+size, self, method, data, resample, fill)
  1578.  
  1579.         return im
  1580.  
  1581.     def __transformer(self, box, image, method, data,
  1582.                       resample=NEAREST, fill=1):
  1583.  
  1584.         # FIXME: this should be turned into a lazy operation (?)
  1585.  
  1586.         w = box[2]-box[0]
  1587.         h = box[3]-box[1]
  1588.  
  1589.         if method == AFFINE:
  1590.             # change argument order to match implementation
  1591.             data = (data[2], data[0], data[1],
  1592.                     data[5], data[3], data[4])
  1593.         elif method == EXTENT:
  1594.             # convert extent to an affine transform
  1595.             x0, y0, x1, y1 = data
  1596.             xs = float(x1 - x0) / w
  1597.             ys = float(y1 - y0) / h
  1598.             method = AFFINE
  1599.             data = (x0 + xs/2, xs, 0, y0 + ys/2, 0, ys)
  1600.         elif method == PERSPECTIVE:
  1601.             # change argument order to match implementation
  1602.             data = (data[2], data[0], data[1],
  1603.                     data[5], data[3], data[4],
  1604.                     data[6], data[7])
  1605.         elif method == QUAD:
  1606.             # quadrilateral warp.  data specifies the four corners
  1607.             # given as NW, SW, SE, and NE.
  1608.             nw = data[0:2]; sw = data[2:4]; se = data[4:6]; ne = data[6:8]
  1609.             x0, y0 = nw; As = 1.0 / w; At = 1.0 / h
  1610.             data = (x0, (ne[0]-x0)*As, (sw[0]-x0)*At,
  1611.                     (se[0]-sw[0]-ne[0]+x0)*As*At,
  1612.                     y0, (ne[1]-y0)*As, (sw[1]-y0)*At,
  1613.                     (se[1]-sw[1]-ne[1]+y0)*As*At)
  1614.         else:
  1615.             raise ValueError("unknown transformation method")
  1616.  
  1617.         if resample not in (NEAREST, BILINEAR, BICUBIC):
  1618.             raise ValueError("unknown resampling filter")
  1619.  
  1620.         image.load()
  1621.  
  1622.         self.load()
  1623.  
  1624.         if image.mode in ("1", "P"):
  1625.             resample = NEAREST
  1626.  
  1627.         self.im.transform2(box, image.im, method, data, resample, fill)
  1628.  
  1629.     ##
  1630.     # Returns a flipped or rotated copy of this image.
  1631.     #
  1632.     # @param method One of <b>FLIP_LEFT_RIGHT</b>, <b>FLIP_TOP_BOTTOM</b>,
  1633.     # <b>ROTATE_90</b>, <b>ROTATE_180</b>, or <b>ROTATE_270</b>.
  1634.  
  1635.     def transpose(self, method):
  1636.         "Transpose image (flip or rotate in 90 degree steps)"
  1637.  
  1638.         self.load()
  1639.         im = self.im.transpose(method)
  1640.         return self._new(im)
  1641.  
  1642. # --------------------------------------------------------------------
  1643. # Lazy operations
  1644.  
  1645. class _ImageCrop(Image):
  1646.  
  1647.     def __init__(self, im, box):
  1648.  
  1649.         Image.__init__(self)
  1650.  
  1651.         x0, y0, x1, y1 = box
  1652.         if x1 < x0:
  1653.             x1 = x0
  1654.         if y1 < y0:
  1655.             y1 = y0
  1656.  
  1657.         self.mode = im.mode
  1658.         self.size = x1-x0, y1-y0
  1659.  
  1660.         self.__crop = x0, y0, x1, y1
  1661.  
  1662.         self.im = im.im
  1663.  
  1664.     def load(self):
  1665.  
  1666.         # lazy evaluation!
  1667.         if self.__crop:
  1668.             self.im = self.im.crop(self.__crop)
  1669.             self.__crop = None
  1670.  
  1671.         # FIXME: future versions should optimize crop/paste
  1672.         # sequences!
  1673.  
  1674. # --------------------------------------------------------------------
  1675. # Factories
  1676.  
  1677. #
  1678. # Debugging
  1679.  
  1680. def _wedge():
  1681.     "Create greyscale wedge (for debugging only)"
  1682.  
  1683.     return Image()._new(core.wedge("L"))
  1684.  
  1685. ##
  1686. # Creates a new image with the given mode and size.
  1687. #
  1688. # @param mode The mode to use for the new image.
  1689. # @param size A 2-tuple, containing (width, height) in pixels.
  1690. # @param color What colour to use for the image.  Default is black.
  1691. #    If given, this should be a single integer or floating point value
  1692. #    for single-band modes, and a tuple for multi-band modes (one value
  1693. #    per band).  When creating RGB images, you can also use colour
  1694. #    strings as supported by the ImageColor module.  If the colour is
  1695. #    None, the image is not initialised.
  1696. # @return An Image object.
  1697.  
  1698. def new(mode, size, color=0):
  1699.     "Create a new image"
  1700.  
  1701.     if color is None:
  1702.         # don't initialize
  1703.         return Image()._new(core.new(mode, size))
  1704.  
  1705.     if isStringType(color):
  1706.         # css3-style specifier
  1707.  
  1708.         import ImageColor
  1709.         color = ImageColor.getcolor(color, mode)
  1710.  
  1711.     return Image()._new(core.fill(mode, size, color))
  1712.  
  1713. ##
  1714. # Creates an image memory from pixel data in a string.
  1715. # <p>
  1716. # In its simplest form, this function takes three arguments
  1717. # (mode, size, and unpacked pixel data).
  1718. # <p>
  1719. # You can also use any pixel decoder supported by PIL.  For more
  1720. # information on available decoders, see the section <a
  1721. # href="pil-decoder.htm"><i>Writing Your Own File Decoder</i></a>.
  1722. # <p>
  1723. # Note that this function decodes pixel data only, not entire images.
  1724. # If you have an entire image in a string, wrap it in a
  1725. # <b>StringIO</b> object, and use {@link #open} to load it.
  1726. #
  1727. # @param mode The image mode.
  1728. # @param size The image size.
  1729. # @param data An 8-bit string containing raw data for the given mode.
  1730. # @param decoder_name What decoder to use.
  1731. # @param *args Additional parameters for the given decoder.
  1732. # @return An Image object.
  1733.  
  1734. def fromstring(mode, size, data, decoder_name="raw", *args):
  1735.     "Load image from string"
  1736.  
  1737.     # may pass tuple instead of argument list
  1738.     if len(args) == 1 and isTupleType(args[0]):
  1739.         args = args[0]
  1740.  
  1741.     if decoder_name == "raw" and args == ():
  1742.         args = mode
  1743.  
  1744.     im = new(mode, size)
  1745.     im.fromstring(data, decoder_name, args)
  1746.     return im
  1747.  
  1748. ##
  1749. # (New in 1.1.4) Creates an image memory from pixel data in a string
  1750. # or byte buffer.
  1751. # <p>
  1752. # This function is similar to {@link #fromstring}, but uses data in
  1753. # the byte buffer, where possible.  This means that changes to the
  1754. # original buffer object are reflected in this image).  Not all modes
  1755. # can share memory; supported modes include "L", "RGBX", "RGBA", and
  1756. # "CMYK".
  1757. # <p>
  1758. # Note that this function decodes pixel data only, not entire images.
  1759. # If you have an entire image file in a string, wrap it in a
  1760. # <b>StringIO</b> object, and use {@link #open} to load it.
  1761. # <p>
  1762. # In the current version, the default parameters used for the "raw"
  1763. # decoder differs from that used for {@link fromstring}.  This is a
  1764. # bug, and will probably be fixed in a future release.  The current
  1765. # release issues a warning if you do this; to disable the warning,
  1766. # you should provide the full set of parameters.  See below for
  1767. # details.
  1768. #
  1769. # @param mode The image mode.
  1770. # @param size The image size.
  1771. # @param data An 8-bit string or other buffer object containing raw
  1772. #     data for the given mode.
  1773. # @param decoder_name What decoder to use.
  1774. # @param *args Additional parameters for the given decoder.  For the
  1775. #     default encoder ("raw"), it's recommended that you provide the
  1776. #     full set of parameters:
  1777. #     <b>frombuffer(mode, size, data, "raw", mode, 0, 1)</b>.
  1778. # @return An Image object.
  1779. # @since 1.1.4
  1780.  
  1781. def frombuffer(mode, size, data, decoder_name="raw", *args):
  1782.     "Load image from string or buffer"
  1783.  
  1784.     # may pass tuple instead of argument list
  1785.     if len(args) == 1 and isTupleType(args[0]):
  1786.         args = args[0]
  1787.  
  1788.     if decoder_name == "raw":
  1789.         if args == ():
  1790.             if warnings:
  1791.                 warnings.warn(
  1792.                     "the frombuffer defaults may change in a future release; "
  1793.                     "for portability, change the call to read:\n"
  1794.                     "  frombuffer(mode, size, data, 'raw', mode, 0, 1)",
  1795.                     RuntimeWarning, stacklevel=2
  1796.                 )
  1797.             args = mode, 0, -1 # may change to (mode, 0, 1) post-1.1.6
  1798.         if args[0] in _MAPMODES:
  1799.             im = new(mode, (1,1))
  1800.             im = im._new(
  1801.                 core.map_buffer(data, size, decoder_name, None, 0, args)
  1802.                 )
  1803.             im.readonly = 1
  1804.             return im
  1805.  
  1806.     return apply(fromstring, (mode, size, data, decoder_name, args))
  1807.  
  1808.  
  1809. ##
  1810. # (New in 1.1.6) Create an image memory from an object exporting
  1811. # the array interface (using the buffer protocol).
  1812. #
  1813. # If obj is not contiguous, then the tostring method is called
  1814. # and {@link frombuffer} is used.
  1815. #
  1816. # @param obj Object with array interface
  1817. # @param mode Mode to use (will be determined from type if None)
  1818. # @return An image memory.
  1819.  
  1820. def fromarray(obj, mode=None):
  1821.     arr = obj.__array_interface__
  1822.     shape = arr['shape']
  1823.     ndim = len(shape)
  1824.     try:
  1825.         strides = arr['strides']
  1826.     except KeyError:
  1827.         strides = None
  1828.     if mode is None:
  1829.         typestr = arr['typestr']
  1830.         if not (typestr[0] == '|' or typestr[0] == _ENDIAN or
  1831.                 typestr[1:] not in ['u1', 'b1', 'i4', 'f4']):
  1832.             raise TypeError("cannot handle data-type")
  1833.         typestr = typestr[:2]
  1834.         if typestr == 'i4':
  1835.             mode = 'I'
  1836.         elif typestr == 'f4':
  1837.             mode = 'F'
  1838.         elif typestr == 'b1':
  1839.             mode = '1'
  1840.         elif ndim == 2:
  1841.             mode = 'L'
  1842.         elif ndim == 3:
  1843.             mode = 'RGB'
  1844.         elif ndim == 4:
  1845.             mode = 'RGBA'
  1846.         else:
  1847.             raise TypeError("Do not understand data.")
  1848.     ndmax = 4
  1849.     bad_dims=0
  1850.     if mode in ['1','L','I','P','F']:
  1851.         ndmax = 2
  1852.     elif mode == 'RGB':
  1853.         ndmax = 3
  1854.     if ndim > ndmax:
  1855.         raise ValueError("Too many dimensions.")
  1856.  
  1857.     size = shape[:2][::-1]
  1858.     if strides is not None:
  1859.         obj = obj.tostring()
  1860.  
  1861.     return frombuffer(mode, size, obj, "raw", mode, 0, 1)
  1862.  
  1863. ##
  1864. # Opens and identifies the given image file.
  1865. # <p>
  1866. # This is a lazy operation; this function identifies the file, but the
  1867. # actual image data is not read from the file until you try to process
  1868. # the data (or call the {@link #Image.load} method).
  1869. #
  1870. # @def open(file, mode="r")
  1871. # @param file A filename (string) or a file object.  The file object
  1872. #    must implement <b>read</b>, <b>seek</b>, and <b>tell</b> methods,
  1873. #    and be opened in binary mode.
  1874. # @param mode The mode.  If given, this argument must be "r".
  1875. # @return An Image object.
  1876. # @exception IOError If the file cannot be found, or the image cannot be
  1877. #    opened and identified.
  1878. # @see #new
  1879.  
  1880. def open(fp, mode="r"):
  1881.     "Open an image file, without loading the raster data"
  1882.  
  1883.     if mode != "r":
  1884.         raise ValueError("bad mode")
  1885.  
  1886.     if isStringType(fp):
  1887.         import __builtin__
  1888.         filename = fp
  1889.         fp = __builtin__.open(fp, "rb")
  1890.     else:
  1891.         filename = ""
  1892.  
  1893.     prefix = fp.read(16)
  1894.  
  1895.     preinit()
  1896.  
  1897.     for i in ID:
  1898.         try:
  1899.             factory, accept = OPEN[i]
  1900.             if not accept or accept(prefix):
  1901.                 fp.seek(0)
  1902.                 return factory(fp, filename)
  1903.         except (SyntaxError, IndexError, TypeError):
  1904.             pass
  1905.  
  1906.     init()
  1907.  
  1908.     for i in ID:
  1909.         try:
  1910.             factory, accept = OPEN[i]
  1911.             if not accept or accept(prefix):
  1912.                 fp.seek(0)
  1913.                 return factory(fp, filename)
  1914.         except (SyntaxError, IndexError, TypeError):
  1915.             pass
  1916.  
  1917.     raise IOError("cannot identify image file")
  1918.  
  1919. #
  1920. # Image processing.
  1921.  
  1922. ##
  1923. # Creates a new image by interpolating between two input images, using
  1924. # a constant alpha.
  1925. #
  1926. # <pre>
  1927. #    out = image1 * (1.0 - alpha) + image2 * alpha
  1928. # </pre>
  1929. #
  1930. # @param im1 The first image.
  1931. # @param im2 The second image.  Must have the same mode and size as
  1932. #    the first image.
  1933. # @param alpha The interpolation alpha factor.  If alpha is 0.0, a
  1934. #    copy of the first image is returned. If alpha is 1.0, a copy of
  1935. #    the second image is returned. There are no restrictions on the
  1936. #    alpha value. If necessary, the result is clipped to fit into
  1937. #    the allowed output range.
  1938. # @return An Image object.
  1939.  
  1940. def blend(im1, im2, alpha):
  1941.     "Interpolate between images."
  1942.  
  1943.     im1.load()
  1944.     im2.load()
  1945.     return im1._new(core.blend(im1.im, im2.im, alpha))
  1946.  
  1947. ##
  1948. # Creates a new image by interpolating between two input images,
  1949. # using the mask as alpha.
  1950. #
  1951. # @param image1 The first image.
  1952. # @param image2 The second image.  Must have the same mode and
  1953. #    size as the first image.
  1954. # @param mask A mask image.  This image can can have mode
  1955. #    "1", "L", or "RGBA", and must have the same size as the
  1956. #    other two images.
  1957.  
  1958. def composite(image1, image2, mask):
  1959.     "Create composite image by blending images using a transparency mask"
  1960.  
  1961.     image = image2.copy()
  1962.     image.paste(image1, None, mask)
  1963.     return image
  1964.  
  1965. ##
  1966. # Applies the function (which should take one argument) to each pixel
  1967. # in the given image. If the image has more than one band, the same
  1968. # function is applied to each band. Note that the function is
  1969. # evaluated once for each possible pixel value, so you cannot use
  1970. # random components or other generators.
  1971. #
  1972. # @def eval(image, function)
  1973. # @param image The input image.
  1974. # @param function A function object, taking one integer argument.
  1975. # @return An Image object.
  1976.  
  1977. def eval(image, *args):
  1978.     "Evaluate image expression"
  1979.  
  1980.     return image.point(args[0])
  1981.  
  1982. ##
  1983. # Creates a new image from a number of single-band images.
  1984. #
  1985. # @param mode The mode to use for the output image.
  1986. # @param bands A sequence containing one single-band image for
  1987. #     each band in the output image.  All bands must have the
  1988. #     same size.
  1989. # @return An Image object.
  1990.  
  1991. def merge(mode, bands):
  1992.     "Merge a set of single band images into a new multiband image."
  1993.  
  1994.     if getmodebands(mode) != len(bands) or "*" in mode:
  1995.         raise ValueError("wrong number of bands")
  1996.     for im in bands[1:]:
  1997.         if im.mode != getmodetype(mode):
  1998.             raise ValueError("mode mismatch")
  1999.         if im.size != bands[0].size:
  2000.             raise ValueError("size mismatch")
  2001.     im = core.new(mode, bands[0].size)
  2002.     for i in range(getmodebands(mode)):
  2003.         bands[i].load()
  2004.         im.putband(bands[i].im, i)
  2005.     return bands[0]._new(im)
  2006.  
  2007. # --------------------------------------------------------------------
  2008. # Plugin registry
  2009.  
  2010. ##
  2011. # Register an image file plugin.  This function should not be used
  2012. # in application code.
  2013. #
  2014. # @param id An image format identifier.
  2015. # @param factory An image file factory method.
  2016. # @param accept An optional function that can be used to quickly
  2017. #    reject images having another format.
  2018.  
  2019. def register_open(id, factory, accept=None):
  2020.     id = string.upper(id)
  2021.     ID.append(id)
  2022.     OPEN[id] = factory, accept
  2023.  
  2024. ##
  2025. # Registers an image MIME type.  This function should not be used
  2026. # in application code.
  2027. #
  2028. # @param id An image format identifier.
  2029. # @param mimetype The image MIME type for this format.
  2030.  
  2031. def register_mime(id, mimetype):
  2032.     MIME[string.upper(id)] = mimetype
  2033.  
  2034. ##
  2035. # Registers an image save function.  This function should not be
  2036. # used in application code.
  2037. #
  2038. # @param id An image format identifier.
  2039. # @param driver A function to save images in this format.
  2040.  
  2041. def register_save(id, driver):
  2042.     SAVE[string.upper(id)] = driver
  2043.  
  2044. ##
  2045. # Registers an image extension.  This function should not be
  2046. # used in application code.
  2047. #
  2048. # @param id An image format identifier.
  2049. # @param extension An extension used for this format.
  2050.  
  2051. def register_extension(id, extension):
  2052.     EXTENSION[string.lower(extension)] = string.upper(id)
  2053.  
  2054.  
  2055. # --------------------------------------------------------------------
  2056. # Simple display support
  2057.  
  2058. def _showxv(image, title=None, command=None):
  2059.  
  2060.     if os.name == "nt":
  2061.         format = "BMP"
  2062.     elif sys.platform == "darwin":
  2063.         format = "JPEG"
  2064.         if not command:
  2065.             command = "open -a /Applications/Preview.app"
  2066.     else:
  2067.         format = None
  2068.         if not command:
  2069.             for cmd in ["eog", "gqview", "gwenview", "xv"]:
  2070.                 if _iscommand(cmd):
  2071.                     command = cmd
  2072.                     break
  2073.             if not command:
  2074.                 # raise OSError, "no image viewer found"
  2075.                 print "no image viewer found"
  2076.             if command in ("xv") and title:
  2077.                 command = command + " -name \"%s\"" % title
  2078.  
  2079.     if image.mode == "I;16":
  2080.         # @PIL88 @PIL101
  2081.         # "I;16" isn't an 'official' mode, but we still want to
  2082.         # provide a simple way to show 16-bit images.
  2083.         base = "L"
  2084.     else:
  2085.         base = getmodebase(image.mode)
  2086.     if base != image.mode and image.mode != "1":
  2087.         file = image.convert(base)._dump(format=format)
  2088.     else:
  2089.         file = image._dump(format=format)
  2090.  
  2091.     if os.name == "nt":
  2092.         command = "start /wait %s && del /f %s" % (file, file)
  2093.     elif sys.platform == "darwin":
  2094.         # on darwin open returns immediately resulting in the temp
  2095.         # file removal while app is opening
  2096.         command = "(%s %s; sleep 20; rm -f %s)&" % (command, file, file)
  2097.     else:
  2098.         command = "(%s %s; rm -f %s)&" % (command, file, file)
  2099.  
  2100.     os.system(command)
  2101.  
  2102. def _isexecutable(cmd):
  2103.     if os.path.isfile(cmd):
  2104.         mode = os.stat(cmd)[stat.ST_MODE]
  2105.         if mode & stat.S_IXUSR or mode & stat.S_IXGRP or mode & stat.S_IXOTH:
  2106.             return True
  2107.     return False
  2108.  
  2109. def _iscommand(cmd):
  2110.     """Return True if cmd is executable or can be found on the executable
  2111.     search path."""
  2112.     if _isexecutable(cmd):
  2113.         return True
  2114.     path = os.environ.get("PATH")
  2115.     if not path:
  2116.         return False
  2117.     for d in path.split(os.pathsep):
  2118.         exe = os.path.join(d, cmd)
  2119.         if _isexecutable(exe):
  2120.             return True
  2121.     return False
  2122.